package com.xinqi.modules.discuss.discuss.service;

import com.xinqi.common.base.response.PageInfo;
import com.xinqi.common.base.response.Param;
import com.xinqi.common.base.response.R;
import com.xinqi.common.mybatis.data.service.BaseService;
import com.xinqi.modules.discuss.discuss.domain.CourseDiscussEntity;
import com.xinqi.modules.discuss.discuss.dto.req.*;
import com.xinqi.modules.discuss.discuss.dto.rsp.CourseDiscussResultDTO;
import com.xinqi.modules.discuss.discuss.dto.rsp.CourseDiscussStatisticsResultDTO;
import com.xinqi.modules.discuss.discuss.dto.rsp.CourseDiscussStudentLogResultDTO;
import com.xinqi.modules.stats.assistant.dto.rsp.AssistantTotalResultDTO;
import com.xinqi.modules.stats.assistant.dto.rsp.StudentInfoResultDTO;

import java.util.List;

/**
 * 课程讨论主表服务层
 *
 * @author: yyzhen
 * @date: 2023/03/13
 */
public interface CourseDiscussService extends BaseService<CourseDiscussEntity> {

    /**
     * 分页查询 -- 带统计数据
     *
     * @param pageable
     * @param query
     * @return
     */
    PageInfo<CourseDiscussResultDTO> selectPage(Param pageable, CourseDiscussQueryDTO query);

    /**
     * 查看用户对此讨论的详情
     *
     * @param id
     * @param userId
     * @return
     */
    CourseDiscussResultDTO findByIdAndUserId(Long id, Long userId);

    /**
     * 新增讨论
     *
     * @param dto
     * @return
     */
    Boolean insert(CourseDiscussCreateDTO dto);

    /**
     * 编辑讨论
     *
     * @param dto
     * @return
     */
    String updateById(CourseDiscussUpdateDTO dto);

    /**
     * 删除讨论
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean removeById(Long id, Long userId);

    /**
     * 批量删除
     *
     * @param dto
     * @return
     */
    Boolean removeByIds(CourseDiscussDeleteDTO dto);

    /**
     * 设为精华
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean isSupper(Long id, Long userId);

    /**
     * 取消精华
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean cancelSuper(Long id, Long userId);

    /**
     * 设为置顶
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean isTop(Long id, Long userId);

    /**
     * 取消置顶
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean cancelTop(Long id, Long userId);

    /**
     * 发布
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean isRelease(Long id, Long userId);

    /**
     * 发布V2版本
     *
     * @param id
     * @param userId 操作人
     * @return
     */
    Boolean isReleaseV2(Long id, Long userId);

    /**
     * 查看学生参与情况列表
     *
     * @param pageable
     * @param query
     * @return
     */
    PageInfo<CourseDiscussStudentLogResultDTO> selectStudentLogPage(Param pageable, CourseDiscussStudentLogQueryDTO query);

    /**
     * 讨论统计
     *
     * @param pageable
     * @param query
     * @return
     */
    PageInfo<CourseDiscussStatisticsResultDTO> selectStatisticsPage(Param pageable, CourseDiscussStatisticsQueryDTO query);

    /**
     * 讨论下载
     *
     * @param dto
     * @return
     */
    List<String> download(CourseDiscussDownloadDto dto);

    /**
     * 讨论 -- 定时发布
     *
     * @return
     */
    boolean releaseDiscuss();

    /**
     * 班级添加成员 -- 讨论同步
     *
     * @param classId
     * @param userId
     * @return
     */
    Boolean classAddMembers(Long classId, Long userId);

    /**
     * 更具ID获取讨论信息
     * @param id
     * @return
     */
    CourseDiscussResultDTO findById(Long id);

    /**
     * 班级退出成员 -- 讨论同步
     *
     * @param classId
     * @param userId
     * @return
     */
    Boolean classRemoveMembers(Long classId, Long userId);

    /**
     * 讨论参与未参与统计
     */
    AssistantTotalResultDTO selectDiscussTakeTotal(Long contentId);

    /**
     * 讨论参与未参与学生列表
     */
    List<StudentInfoResultDTO> selectDiscussTakeStudent(Long contentId, Integer isPartake);

    /**
     * 讨论进行中列表查询
     */
    List<CourseDiscussEntity> selectDiscussRunningList(Long classId);

    /**
     * 评论参与
     */
    void participate(Long classId, Long contentId, Long userId);


    /**
     * 同步主表 -- 讨论
     *
     * @param discuss
     */
    void synchroContentDiscuss(CourseDiscussResultDTO discuss);

    /**
     * 同步主表 -- 讨论
     *
     * @param discussList
     */
    void synchroContentDiscuss(List<CourseDiscussResultDTO> discussList);
}
